package com.mycrawler;

import us.codecraft.webmagic.Spider;


/***
 * 组件介绍
 * 1.downloader 下载器组件
 * 2.PageProcessor 页面解析组件
 * 3.scheculer 访问队列组件
 * 4.pipeline 数据持久化组件 （默认是输出到控制台）
 */

/***
 * 组件介绍
 * 1.downloader
 * 下载器组件。使用httpclient实现
 * 如果没有特殊需求不需要自定义，默认的组件就可以满足全部需求
 * 自定义时需要实现downloader接口
 * 向PageProcess传递数据时，把结果封装成page对象
 * 2.pageProcess
 * 页面分析的业务组件，页面分析的逻辑在其中实现
 * site
 * 代表站点信息
 * 可以设置抓取的频率
 * 重试的次数
 * 超时时间
 * page
 * getHtml() 返回抓取的结果
 * getResult()  返回ResultItems对象，向pipeline传递数据时使用
 * addTargetRequests(),addTargetRequest():向scheduler
 * HTML
 * html也是一个selectable对象
 * 一个selectable就可以表示一个dom节点
 * 使用html解析页面的 三种方式
 * 使用原生的jsoup方法进行解析，
 * 使用css选择器解析
 * 使用xpath来解析
 *
 */


/***
 * resultItems
 * 作用就是把解析的结果传递给pipeline
 * 可以使用page对象的getResultItem()
 */


/***
 * Request
 * 并不是http请求的request对象，就是把url封装成Request对象
 * 可以添加一个，也可以添加多个
 */


/***
 * pipeline
 * 数据持久化组件
 * consolePipeline 向控制台输出，默认使用
 * FilePipeline：向磁盘文件中输出
 * JsonFilePipeline：保存json格式的文件
 * 自定义pipeline
 *      需要实现pipleline接口
 *
 */


/***
 * scheduler队列
 *          访问url队列
 *          1）默认使用的内存队列
 *             url数据量大时会占用大量的内存。
 *             QueueScheduler
 *          2）文件形式的队列
 *              FileCacheQueueScheduler
 *              需要制定保存队列文档路径以及文件名
 *          3）使用redis队列
 *              实现分布式爬虫时。大规模爬虫时使用
 *
 *
 * webmagic框架中可以对url进行去重处理。
 * 1）默认使用hashset进行去重
 *     在内存中进行去重处理。需要占用大量的内存。
 * 2）规模大时应该使用redis去重
 *     使用redis成本高
 * 3）布隆过滤器：
 *     优点：占内存小，速度快，成本低。
 *     缺点：有可能误判，不能删除。
 *
 *
 *
 */


/****
 * spider 工具类，可以初始化爬虫
 * 在spider 中配置各个组件
 * 启动爬虫
 */
public class Main {


    /***
     * 同步方法，在当前线程中执行爬虫
     * run()
     * 在新线程中爬取
     * start()
     * @param args
     */
    public static void main(String[] args) {
        Spider.create(new MyPageProcessor())
        .addUrl("http://www.itcast.cn").run();
    }
}
